<?php
/*
 BLOGBAR.INC.PHP by martin $ 2009/03/05 22:23:39
*/
checkADMIN();

if(GD!=TRUE){
 return $DIVISION['body'] .= '<p class="alert">ブロッグバー作成には，GDライブラリーが必須です。<br />
 サーバー管理者に問い合わせてみて下さい。</p>';
}

$header = $body = '';

$targetTheme = v_('aim')!='' ? v_('aim') : $theme;

foreach ($THEME_LIST as $name=>$path){
 if($targetTheme==$path){
  $themeName = $name; break;
 }
}

$_IMGDIR = v_('aim')!='' ? dirname(v_('aim')).'/' : $theme_dir;

$img_file = $_IMGDIR.'blogBar_'.time().'.png';

/* 好きな英字フォント(TrueType)をトップディレクトリに置いとけば，それがタイトル文字に反映 */
$path2font = PATH.'georgiaz.ttf';

if(isset($_COOKIE['P2B_BLOGBAR']) && !strstr($_COOKIE['P2B_BLOGBAR'], '|||')){
 list($width,$height,$barcolor,$textcolor,$ttextcolor,$bar_title,$start_log) = explode('|',$_COOKIE['P2B_BLOGBAR']);
} else {
 $width = 140;
 $height = 45;
 $bar_title = '';
 $start_log = date('Ym', strtotime('-1 month')).'01';
 $barcolor = '00,00,00';
 $textcolor = 'ff,ff,ff';
 $ttextcolor = '00,00,00';
}

if(!empty($_POST)){
 $width = p_('width');
 $height = p_('height');
 $barcolor = hex2int(validColor(p_('barcolor')));
 $barcolor = $barcolor['r'].','.$barcolor['g'].','.$barcolor['b'];
 $textcolor = hex2int(validColor(p_('textcolor')));
 $textcolor = $textcolor['r'].','.$textcolor['g'].','.$textcolor['b'];
 $ttextcolor = hex2int(validColor(p_('ttextcolor')));
 $ttextcolor = $ttextcolor['r'].','.$ttextcolor['g'].','.$ttextcolor['b'];
 $bar_title = p_('bar_title');
 $start_log = p_('start_log');
 setcookie('P2B_BLOGBAR', join('|',array($width,$height,$barcolor,$textcolor,$ttextcolor,$bar_title,$start_log)).'|', time()+(60*60*24*365));
}
$bc = explode(',', $barcolor);
$fu = 2; // font_id of title
$tc = explode(',', $textcolor);
$ttc = explode(',', $ttextcolor);
$lc = array(255,255,255); // lucent

$_LOGS = $__LOGS = $_lines = array();
foreach ($LOGS as $i=>$log){
 $_LOGS[] = basename($log, EXT);
 if($i==5) break;
}
foreach($_LOGS as $L){
 $__LOGS[] = $L;
 if($L==substr($start_log,0,6)) break;
}

$start_log = preg_match("{^[0-9]+$}", $start_log) ? $start_log : date('Ym');

$start = date('Y.m', strtotime($start_log));
$end = date('Y.m', strtotime((int)($_LOGS[0].'01')));
$span = ($start_log==$_LOGS[0].'01') ? date('F Y', strtotime($start_log)) : $start.'-'.$end;
$img = imagecreate($width, $height + 15);
$clear = imagecolorallocate($img, $lc[0], $lc[1], $lc[2]);
imagecolortransparent($img, $clear); // 透明に

$tcol = imagecolorallocate($img, $tc[0], $tc[1], $tc[2]);
$ttcol = imagecolorallocate($img, $ttc[0], $ttc[1], $ttc[2]);
$bcol = imagecolorallocate($img, $bc[0], $bc[1], $bc[2]);
imagefilledrectangle($img, 5, 13, $width-6, $height-11, $bcol); // Bar

$GD2 = function_exists('imagesetthickness') ? TRUE : FALSE;

// バーコードっぽく
if($GD2)imagesetthickness($img, 2);
imageline($img, 1, 13, 1, $height-5, $bcol);
if($GD2)imagesetthickness($img, 1);
imageline($img, 3, 13, 3, $height-5, $bcol);
if($GD2)imagesetthickness($img, 2);
imageline($img, $width-3, 13, $width-3, $height-5, $bcol);
if($GD2)imagesetthickness($img, 1);
imageline($img, $width-6, 13, $width-6, $height-5, $bcol);

if(is_array($__LOGS)){ // バーの配列作成
 foreach ($__LOGS as $log){
  $lines = my_file(LOG.$log.EXT);
  if(is_array($lines)) $_lines = array_merge($_lines, $lines);
 }
}

if($GD2)imagesetthickness($img, 1);

foreach ($_lines as $line){ // エントリーラインの生成
 $uid = explode('|', $line); $uid = substr(array_shift($uid),0,10);
 $entry_time = date('G', $uid)*60 + date('i', $uid);
 $entry_x = 3 + (int)($entry_time*($width-10)/(24*60));
 imageline($img, $entry_x, 13, $entry_x, $height-10, $clear);
}

for ($i = 1; $i <= 11; $i++){ // 時間軸の作成
 imagestring($img, 1, $i*(int)(($width)/12), $height - 9, $i * 2, $tcol);
}

// バータイトル及び表示期間の作成
if($path2font!='' && is_file($path2font)){ // 指定フォントを使う
 $fb = imagettfbbox(8, 0, $path2font, $bar_title);
 $str_width = (int)($fb[2]-$fb[0]+5);
 $str_height = (int)abs($fb[7]-$fb[1]);
 $span_posX = ceil(($width - $str_width)/2);
 ImageTTFText($img, 9, 0, $span_posX, ceil($height/2)+5, $ttcol, $path2font, $bar_title); // Bar title
 $fb = imagettfbbox(8, 0, $path2font, $span);
 $str_width = (int)($fb[2]-$fb[0]+5);
 $span_posX = $width - $str_width;
 ImageTTFText($img, 8, 0, $span_posX, 10, $tcol, $path2font, $span); // Span
} else { // 組み込みフォントを使う
 $str_width = imagefontwidth($fu)*count(preg_split('//', $bar_title, -1, PREG_SPLIT_NO_EMPTY))-16;
 imagestring($img, $fu, ceil(($width-$str_width)/2 - 10), $height, $bar_title, $ttcol); // Bar title
 $str_width = imagefontwidth($fu)*count(preg_split('//', $span, -1, PREG_SPLIT_NO_EMPTY))-16;
 $span_posX = $width - $str_width;
 imagestring($img, $fu, 3, 0, $span, $tcol);
}

$d = @opendir($_IMGDIR) or die('Cannot open '.$_IMGDIR.'!');
while ($file = readdir($d)){ 
 if(preg_match("/^blogBar_.*/", $file)) $former_img = $_IMGDIR.$file;
}
closedir($d);

if(!empty($_POST)){
 if(isset($former_img)) unlink($former_img);
 imagepng($img, $img_file); // PNG画像の生成
 if(filesize($img_file)==0) die($img_file.'s file size is zero!');
}
$body = '<div id="blogbar-wrapper">'.NL;

$body .= '
<script type="text/javascript">

function Palette(){
 if(client.Gecko) o([MozToolTip, MozToolTipShadow]).hide();
 paletteTarget = oParts.evt.target;
 hsvmap.moveTo(oParts.target(0) - 200, oParts.target(1) - 100);
 paletteToolTip.moveTo(hsvmap.X + 30, hsvmap.Y + 20);
 paletteInfo.moveTo(hsvmap.X + 200, hsvmap.Y);
 o([hsvmap, paletteInfo, paletteToolTip]).css("opacity:1").show();
}

function togglePalette(){
 var tar = o("#" + paletteTarget.id.toString().replace(/^_/, ""));
 tar.value(_hex()); tar.css("background-color:" + _hex());
 o([hsvmap, paletteInfo, paletteToolTip]).hide();
}

window.onload = function(){
 buildPalette();
 hsvmap.on("mousemove", _hex = function(){
  var c = getRGB(hsvmap);
  var hex = "#"+dec2hex(c[0])+dec2hex(c[1])+dec2hex(c[2]);
  hsvmap.css("cursor:crosshair");
  paletteToolTip.html(hex).moveTo(oParts.evt.pageX + 30, oParts.evt.pageY + 20);
  paletteInfo.moveTo(hsvmap.X + 200, hsvmap.Y).css("background-color:" + hex);
  return hex;
 });
 hsvmap.on("mouseout", function(){
  o([hsvmap, paletteInfo, paletteToolTip]).fade();
 });
 hsvmap.on("click", togglePalette);
}

</script>
<style type="text/css">
.chart { vertical-align: top; padding-left: 3px; }
.box { width: 18px; height: 18px; vertical-align: top; }
td.rt { padding-right: 5px; }
</style>
';

$targetImg = '';
if(is_file($img_file)){
 $targetImg = $img_file;
} else {
 if(isset($former_img)) $targetImg = $former_img;
}

if($targetImg!=''){
 $size = getimagesize($targetImg);
 list(, $utime) = explode('_', $targetImg);
 $utime = str_replace('.png', '', $utime);
 $on = 'Generated on '.date('Y/m/d H:i:s', $utime);
 $blogbar = '<img src="'.$targetImg.'" '.$size[3].' alt="" title="'.$on.'" />';
} else $blogbar = '';

$body .= '<p style="background: #fff; padding: 10px; width: '.$width.'px; margin: auto; border: 1px solid crimson;">'.$blogbar.'</p>'.NL;

$body .= '
<ul class="p2em" style="width:500px;">
 <li>各テーマ毎にブロッグバーを作成できます</li>
 '.(USE_BLOG_BAR ? '' : '<li style="color:crimson;">現在、ブログバーの表示設定はオフになっています。これは環境設定で指定できます。</li>').'
 <li> テーマ<form action="admin.php" style="display: inline;">
  <select name="targetTheme"
   onchange="location.href=\'admin.php?mode=blogbar&amp;aim=\'+this.value;this.blur();">
';
foreach ($THEME_LIST as $name=>$path){
 if(v_('aim')!=''){
  $sel = v_('aim')==$path ? ' selected="selected"' : "";
 } else $sel = $targetTheme==$path ? ' selected="selected"' : "";
 $body .= '  <option value="'.$path.'"'.$sel.'> '.$name.' </option>'.NL;
}

$body .= '
  </select></form>&nbsp;のブロッグバー'.($blogbar==''?'はまだ作成されていません':'を表示しています').'
 </li>
 <li>バーやテキストの色は，右横にあるカラーアイコンをクリックすると、カラーパレットが現れるので、そこでお好きな色をクリックして下さい。その色が反映されます。</li>
 <li>好みの設定にしたら作成ボタンを押して下さい。うまくいけば、上部にブログバーが表示されます。</li>
</ul>
<form method="post" action="admin.php" style="width: 600px;"> 
<fieldset><legend>テーマ：'.$themeName.' のblogBar の作成</legend>
<p>
 <input type="hidden" name="mode" value="blogbar" />
 <input type="hidden" name="aim" value="'.$targetTheme.'" />
</p>
<table style="margin: 1.5em auto 0 auto;">
<tr>
 <td class="rt">いつからのエントリーを表示するか</dt> 
 <td class="lt">
<select name="start_log" id="start_log">
';

foreach ($_LOGS as $i=>$log){
 $sel = $start_log==$log.'01' ? ' selected="selected"' : '';
 $body .= '<option value="'.$log.'01"'.$sel.'> '.date('Y/m',strtotime($log.'01')).'　</option>'.NL;
}
$body .= '
</select>
 </td>
</tr>
<tr>
 <td class="rt"> 横幅（ピクセル値） </td>
 <td class="lt"><input type="text" name="width" size="6" value="'.$width.'" /></td>
</tr>
<tr>
 <td class="rt"> 縦幅（ピクセル値） </td>
 <td class="lt"><input type="text" name="height" size="6" value="'.$height.'" /></td>
</tr>
<tr>
 <td class="rt"> バーの色 </td>
 <td class="lt">
  <input type="text" name="barcolor" id="barcolor" size="6" value="'.int2hex($bc[0],$bc[1],$bc[2]).'" />
  <img id="_barcolor" class="chart" src="Images/colorchart.png" alt="" onclick="Palette()" />
 </td>
</tr>
<tr>
 <td class="rt"> タイトルの色 </td>
 <td class="lt">
  <input type="text" name="ttextcolor" id="ttextcolor" size="6" value="'.int2hex($ttc[0],$ttc[1],$ttc[2]).'" />
  <img id="_ttextcolor" class="chart" src="Images/colorchart.png" alt="" onclick="Palette()" />
 </td>
</tr>
<tr>
 <td class="rt"> 上記以外のテキストの色 </td>
 <td class="lt">
  <input type="text" name="textcolor" id="textcolor" size="6" value="'.int2hex($tc[0],$tc[1],$tc[2]).'" />
  <img id="_textcolor" class="chart" src="Images/colorchart.png" alt="" onclick="Palette()" />
 </td>
</tr>
<tr>
 <td class="rt"> バーの中に表示するテキスト(半角英数のみ)</td>
 <td class="lt"><input type="text" name="bar_title" size="20" value="'.$bar_title.'" /></td>
</tr>
</table>
<p class="center" style="margin: 1em auto 2em auto;">
 <button type="submit" title="これで作成！">ブログバー作成</button>
</p>
</fieldset>
</form>
</div>
';
 
return $DIVISION['body'] .= $header.$body;

function validColor($in='000000',$def='000000') {
 return (preg_match('/^#[0-9a-f]{6}$/i', $in)) ? substr($in,1,6) : $def;
}
function hex2int($hex){
 return array(
  'r' => hexdec(substr($hex, 0, 2)),
  'g' => hexdec(substr($hex, 2, 2)),
  'b' => hexdec(substr($hex, 4, 2))
 );
}
function int2hex($r,$g,$b){
 return '#'.str_pad(dechex($r), 2, '0', STR_PAD_LEFT)
           .str_pad(dechex($g), 2, '0', STR_PAD_LEFT)
           .str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
}
?>